
#include"SeqList.h"

void SeqListInit(SL* psl)
{
	assert(psl);
	psl->arr = NULL;
	psl->size = psl->capacity = 0;
}
void SeqListDestory(SL* psl)
{
	if(psl != NULL)
	{
		free(psl->arr);
		psl->arr = NULL;
		psl->size = psl->capacity = 0;
	}
}
//封装一个用于扩容的子接口;
static void SLShiftCapacity(SL* psl)
{
	int newcapacity = (psl->capacity == 0?4:2*psl->capacity);
	SLDateType* tmp = (SLDateType*)realloc(psl->arr,newcapacity*sizeof(SLDateType));
	if(!tmp)
	{
		perror("realloc mistake");
		exit(-1);
	}
	psl ->arr = tmp;
	psl ->capacity = newcapacity;
}
void SeqListFrontPush(SL* psl,SLDateType vimal)
{
	//断言
	assert(psl);
	//查容
	if(psl->size >= psl->capacity)
		SLShiftCapacity(psl);
	//插入 1.把数据进行移动（注意：应该从末尾进行数据移动，庄梦涵真苯） 2.插入数据x于下标0位置
	int i;
	for(i = psl->size-1 ; i >= 0 ; i--)
	{
		psl->arr[i+1] = psl->arr[i];
	}
	psl->arr[0] =  vimal;
	psl->size++;
}
void SeqListBackPush(SL* psl ,SLDateType vimal)
{	
	//断言
	assert(psl);
	//查容
	if(psl->size >= psl->capacity)
		SLShiftCapacity(psl);
	//插入
	psl->arr[psl->size++] = vimal;
}
void SeqListFrontPop(SL* psl)
{
	assert(psl && psl->size);
	int i;
	for(i = 0; i < psl->size-1; i++)
	{
		psl->arr[i] = psl ->arr[i+1];
	}
	psl->size -=1;
}
void SeqListBackPop(SL* psl)
{
	assert(psl && psl->size);
	psl->size -= 1;
}
void SeqListPrint(SL* psl)
{
	assert(psl);
	int i;
	for(i = 0; i < psl->size; i++)
	{
		printf("%d ",psl->arr[i]);
	}
	printf("\n");
}
void SeqListInsert(SL* psl,int pos,SLDateType vimal)
{
	//断言
	assert(psl && 0 <= pos && pos <= psl->size);
	//查容
	if(psl->size >= psl->capacity)
		SLShiftCapacity(psl);
	//将包括pos在内的后面的数据进行移动
	int i;
	for(i = psl->size;i>pos;i--)
	{
		psl->arr[i] = psl->arr[i-1];
	}
	//插入数据
	psl->arr[pos] = vimal;
	psl->size++;
}
void SeqListDelete(SL* psl,int pos)
{
	//断言
	assert(psl && 0 <= pos && pos < psl->size);
	//数据覆盖
	int i;
	for(i = pos; i < psl->size-1; i++)
	{
		psl->arr[i] = psl->arr[i+1];
	}
	//调整有效数据size的值
	psl->size--;
}
int SeqListFind(SL* psl,SLDateType x)
{
	assert(psl);
	int i;
	for(i = 0;i<psl->size;i++)
	{
		//顺序表是一个非常底层的数据结构；
		//故利用memcpy函数，来应对不同的数据；
		if(0 == memcmp(&psl->arr[i],&x,sizeof(SLDateType)))
		{
			return i;
		}
	}
	//找不到
	return -1;
}
void SeqListModify(SL* psl,int pos,SLDateType new_vimal)
{
	assert(psl && 0 <= pos && pos < psl->size);
	//对下标pos进行修改
	//同理为了达到能应付不同的数据，我也是利用了memcpy的思想
	memcpy(&psl->arr[pos],&new_vimal,sizeof(SLDateType));
}